namespace study2_02 {

    // 2. 类的继承
    // 继承是面向对象编程的重要特性，允许一个类继承另一个类的属性和方法，从而实现代码的复用。

    // 2.1 基本继承
    // 使用 extends 关键字可以让一个类继承另一个类。子类可以继承父类的属性和方法。
    class Animal {
        name: string
        constructor(name: string) {
            this.name = name
        }

        move(distance: number) {
            console.log(`${this.name} moved ${distance}m`); // dog.move(10)

        }

    }

    class Dog extends Animal {
        bark() {
            console.log('Woof! Woof!'); // Woof! Woof!
        }
    }

    let dog = new Dog('Buddy')
    dog.bark()
    dog.move(10)


    // 2.2 调用父类构造函数
    // 在子类的构造函数中，必须首先调用 super()，以初始化父类的属性。super 也可以用来调用父类的方法。
    class Animal2 {
        constructor(public name: string) {
            this.name = name
        }
        move(distance: number = 0) {
            console.log(`${this.name} moved ${distance}m`);

        }
    }

    class Bird extends Animal {
        constructor(name: string, public wingspan: number) {
            super(name)
        }

        fly(distance: number) {
            console.log(`${this.name} is flying with a wingspan of ${this.wingspan}m`); // Eagle is flying with a wingspan of 2m
            super.move(distance) // Eagle moved 20m
        }

    }

    let bird = new Bird('Eagle', 2)
    bird.fly(20)


    // 2.3 方法重写
    // 子类可以重写父类的方法，但需要确保方法签名（参数和返回类型）与父类方法一致。
    class Animal3 {
        constructor(public name: string) {
            this.name = name
        }

        move(distance: number = 0) {
            console.log(`${this.name} moved ${distance} m`); // 蛇 moved 5 m

        }
    }

    class Snake extends Animal3 {
        move(distance: number = 5) {
            console.log(`爬呀爬。。。`); // 爬呀爬。。。
            super.move(distance)

        }
    }
    let snake = new Snake('蛇')
    snake.move()


    // 2.4 抽象类与抽象方法
    // 抽象类不能实现实例化，只能被继承。抽象类可以包含抽象方法，子类必须实现这些方法。
    abstract class Animal4 {

        constructor(public name: string) { }

        abstract move(distance: number): void

        printName(): void {
            console.log(`Animal name:` + this.name);

        }
    }

    class Snake4 extends Animal4 {
        constructor() {
            super('蛇');

        }

        move(distance: number): void {
            console.log(`${this.name} 正在蜿蜒的移动。。。`);
            console.log(`${this.name} 移动了 ${distance} 米`);

        }

        hiss(): void {
            console.log(`${this.name} 在嘶嘶作响！`);

        }
    }

    let animal4: Animal4;
    animal4 = new Snake4()
    animal4.printName();
    animal4.move(5)






}